﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Smart
{
    public partial class frmSayim : Form
    {
        private enum Secim
        {
            StokSecim,
            SayilanListesi
        }

        private Secim Islem { get; set; }
        private int SecilenStokId { get; set; }
        private int SecilenBarkodId { get; set; }


        public frmSayim()
        {
            InitializeComponent();
            txtMiktar.KeyPress += new KeyPressEventHandler(txtMiktar_KeyPress);
            gridControl1.DoubleClick += new EventHandler(gridControl1_DoubleClick);
            txtFiltre.TextChanged += new EventHandler(txtFiltre_TextChanged);
            cmbFiltre.SelectedIndexChanged += new EventHandler(cmbFiltre_SelectedIndexChanged);
            btnTemizle.Click += new EventHandler(btnTemizle_Click);
            txtStokAdi.ReadOnly = true;
            txtSayilan.ReadOnly = true;
            txtStokKodu.ReadOnly = true;
            txtFiyat.ReadOnly = true;
            txtBirim.ReadOnly = true;
            txtEnvanter.ReadOnly = true;
        }

        void btnTemizle_Click(object sender, EventArgs e)
        {
            ClearValues();
        }

        void cmbFiltre_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbFiltre.SelectedIndex == 1)
                ClearValues();
        }

        void txtMiktar_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                if (txtMiktar.TextLength <= 7)
                    SatirEkle();
                else
                {
                    txtMiktar.Text = "";
                    MessageBox.Show("Miktara Barkod Okuttunuz Miktarı Kontrol Ediniz !");
                }
            }
        }

        void txtFiltre_TextChanged(object sender, EventArgs e)
        {
            txtFiltre.BackColor = Color.White;
        }

        void gridControl1_DoubleClick(object sender, EventArgs e)
        {
            int row = gridControl1.CurrentRowIndex;
            if (row > -1)
            {
                if (Islem == Secim.StokSecim)
                {
                    SecilenStokId = Convert.ToInt32(gridControl1[row, 4]);
                    if (gridControl1[row, 5] != DBNull.Value) SecilenBarkodId = Convert.ToInt32(gridControl1[row, 5]); else SecilenBarkodId = -1;

                    txtStokAdi.Text = gridControl1[row, 0].ToString();
                    txtFiltre.Text = gridControl1[row, 1].ToString();
                    txtStokKodu.Text = gridControl1[row, 3].ToString();
                    txtEnvanter.Text = gridControl1[row, 2].ToString();
                    txtFiyat.Text = gridControl1[row, 6].ToString();
                    txtBirim.Text = gridControl1[row, 7].ToString();

                    if (SecilenBarkodId != -1)
                        txtSayilan.Text = SqlCeClient.Get.ExecScalar<decimal>(string.Format("SELECT     SUM(TBL_SAYIM.sym_miktar) AS miktar FROM TBL_SAYIM INNER JOIN TBL_BARKOD ON TBL_SAYIM.sym_barkodid = TBL_BARKOD.rec_id WHERE (TBL_SAYIM.sym_tarih = '{0}') AND (TBL_SAYIM.sym_depoid = {1}) AND (TBL_SAYIM.sym_evrakno = {2}) AND (TBL_BARKOD.bk_barkod = '{3}')", dteTarih.Value.ToSqlString(), ((DbDepo)cmbDepo.SelectedItem).recId, txtSayimNo.Text, txtFiltre.Text)).ToString();
                    else
                        txtSayilan.Text = SqlCeClient.Get.ExecScalar<decimal>(string.Format("SELECT     SUM(TBL_SAYIM.sym_miktar) AS miktar FROM TBL_SAYIM INNER JOIN TBL_STOK ON TBL_SAYIM.sym_stokid = TBL_STOK.rec_id WHERE (TBL_SAYIM.sym_tarih = '{0}') AND (TBL_SAYIM.sym_depoid = {1}) AND (TBL_SAYIM.sym_evrakno = {2}) AND (TBL_STOK.rec_id = {3})", dteTarih.Value.ToSqlString(), ((DbDepo)cmbDepo.SelectedItem).recId, txtSayimNo.Text, SecilenStokId)).ToString();


                    tabControl1.SelectedIndex = 1;
                    txtMiktar.Focus();
                }
                else
                {
                    if (gridControl1.ContextMenu != null)
                        contextMenu1.Show(gridControl1, new Point(gridControl1.GetCellBounds(row, 0).X, gridControl1.GetCellBounds(row, 0).Y));
                }
            }
        }

        private void frmSayim_Load(object sender, EventArgs e)
        {
            tabControl1.SelectedIndex = 0;
            tabPage3.Enabled = false;
            tabPage5.Enabled = false;
            dteTarih.Value = DateTime.Now;
            cmbFiltre.SelectedIndex = 0;
            txtSayimNo.Focus();

            if (!string.IsNullOrEmpty(Program.Session.VarsayilanDepo().ToString()))
            {
                string depo = Program.Session.VarsayilanDepo().ToString();
                cmbDepo.Enabled = false;

                using (Query q = new Query(ProgramTipleri.SqlCe))
                {
                    q.Add(string.Format("select * from TBL_DEPO where dep_kodu='{0}'", depo));
                    var liste = q.ToList(new { id = 0, Adi = "", Kodu = "" });
                    List<DbDepo> depos = new List<DbDepo>();
                    foreach (var item in liste)
                    {
                        depos.Add(new DbDepo() { Adi = item.Adi, Kodu = item.Kodu, recId = item.id });
                    }
                    cmbDepo.DataSource = depos;
                }
            }
            else
            {
                using (Query q = new Query(ProgramTipleri.SqlCe))
                {
                    q.Add("select * from TBL_DEPO");
                    var liste = q.ToList(new { id = 0, Adi = "", Kodu = "" });
                    List<DbDepo> depos = new List<DbDepo>();
                    foreach (var item in liste)
                    {
                        depos.Add(new DbDepo() { Adi = item.Adi, Kodu = item.Kodu, recId = item.id });
                    }
                    cmbDepo.DataSource = depos;
                }
            }
            cmbDepo.DisplayMember = "Adi";
            cmbDepo.ValueMember = "recId";
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            SayimGiris();
        }

        private void SayimGiris()
        {
            if (string.IsNullOrEmpty(txtSayimNo.Text))
            {
                txtSayimNo.Text = (SqlCeClient.Get.ExecScalar<int>(string.Format("select max(sym_evrakno) from TBL_SAYIM where sym_tarih='{0}' and sym_depoid={1}", dteTarih.Value.ToSqlString(), ((DbDepo)cmbDepo.SelectedItem).recId)) + 1).ToString();
            }
            tabControl1.SelectedIndex = 1;
            tabPage5.Enabled = true;
            ClearValues();
            txtFiltre.Focus();
        }

        private void txtFiltre_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                UrunBul();
            }
        }

        private void UrunBul()
        {
            string sqltxt = string.Empty;
            if (cmbFiltre.SelectedIndex == 0) //barkoda göre ara
            {
                sqltxt = string.Format("SELECT     TBL_STOK.stk_kod, TBL_STOK.stk_adi, TBL_ENVANTER.env_miktar, TBL_STOK.rec_id,TBL_BARKOD.rec_id as barkodid,TBL_STOK.stk_fiyat1,TBL_STOK.stk_birim1adi FROM TBL_BARKOD INNER JOIN TBL_STOK ON TBL_BARKOD.bk_stok_id = TBL_STOK.rec_id LEFT OUTER JOIN TBL_ENVANTER ON TBL_STOK.rec_id = TBL_ENVANTER.rec_id WHERE     (TBL_BARKOD.bk_barkod = '{0}')", txtFiltre.Text);
                DataTable dt = SqlCeClient.Get.Fill(sqltxt);
                if (dt.Rows.Count > 0)
                {
                    SecilenStokId = Convert.ToInt32(dt.Rows[0]["rec_id"]);
                    SecilenBarkodId = Convert.ToInt32(dt.Rows[0]["barkodid"]);

                    txtStokAdi.Text = dt.Rows[0]["stk_adi"].ToString();
                    txtStokKodu.Text = dt.Rows[0]["stk_kod"].ToString();
                    txtEnvanter.Text = dt.Rows[0]["env_miktar"].ToString();
                    txtFiyat.Text = dt.Rows[0]["stk_fiyat1"].ToString();
                    txtBirim.Text = dt.Rows[0]["stk_birim1adi"].ToString();

                    txtSayilan.Text = SqlCeClient.Get.ExecScalar<decimal>(string.Format("SELECT     SUM(TBL_SAYIM.sym_miktar) AS miktar FROM TBL_SAYIM INNER JOIN TBL_BARKOD ON TBL_SAYIM.sym_barkodid = TBL_BARKOD.rec_id WHERE (TBL_SAYIM.sym_tarih = '{0}') AND (TBL_SAYIM.sym_depoid = {1}) AND (TBL_SAYIM.sym_evrakno = {2}) AND (TBL_BARKOD.bk_barkod = '{3}')", dteTarih.Value.ToSqlString(), ((DbDepo)cmbDepo.SelectedItem).recId, txtSayimNo.Text, txtFiltre.Text)).ToString();
                    txtMiktar.Focus();
                }
                else
                {
                    ClearValues();
                    txtFiltre.Text = "BULUNAMADI !";
                    txtFiltre.SelectAll();
                    txtFiltre.BackColor = Color.Red;
                }
            }
            else
            {
                sqltxt = string.Format("SELECT     TBL_STOK.stk_adi,TBL_BARKOD.bk_barkod,TBL_ENVANTER.env_miktar,TBL_STOK.stk_kod,TBL_STOK.rec_id,TBL_BARKOD.rec_id as barkodid,TBL_STOK.stk_fiyat1 AS Fiyat,TBL_STOK.stk_birim1adi as Birim FROM TBL_BARKOD RIGHT OUTER JOIN TBL_STOK ON TBL_BARKOD.bk_stok_id = TBL_STOK.rec_id LEFT OUTER JOIN TBL_ENVANTER ON TBL_STOK.rec_id = TBL_ENVANTER.rec_id WHERE (TBL_STOK.stk_adi LIKE '{0}%')", txtFiltre.Text);
                gridControl1.VeriKaynagi = SqlCeClient.Get.Fill(sqltxt);
                gridControl1.Columns[0].HeaderText = "Stok Adı";
                gridControl1.Columns[0].Width = 200;
                gridControl1.Columns[1].HeaderText = "Barkod";
                gridControl1.Columns[1].Width = 100;
                gridControl1.Columns[2].HeaderText = "Depo Miktar";
                gridControl1.Columns[3].Width = -1;
                gridControl1.Columns[4].Width = -1;

                this.Islem = Secim.StokSecim;
                tabControl1.SelectedIndex = 2;
                tabPage3.Enabled = true;
                gridControl1.ContextMenu = null;
                if (gridControl1.RowCount > 0)
                    gridControl1.Select(0);
            }
        }

        private void btnSayilanListe_Click(object sender, EventArgs e)
        {
            this.Islem = Secim.SayilanListesi;
            tabControl1.SelectedIndex = 2;
        }

        private void SayilanListesi()
        {
            gridControl1.VeriKaynagi = SqlCeClient.Get.Fill(string.Format("SELECT     TBL_STOK.stk_adi AS [Stok Adı], TBL_SAYIM.sym_miktar AS Miktar,TBL_BARKOD.bk_barkod AS Barkod,TBL_SAYIM.sym_satirno as Satır FROM TBL_SAYIM LEFT OUTER JOIN TBL_BARKOD ON TBL_SAYIM.sym_barkodid = TBL_BARKOD.rec_id INNER JOIN TBL_STOK ON TBL_SAYIM.sym_stokid = TBL_STOK.rec_id WHERE (TBL_SAYIM.sym_tarih = '{0}') AND (TBL_SAYIM.sym_depoid = {1}) AND (TBL_SAYIM.sym_evrakno = {2}) ORDER BY TBL_SAYIM.sym_satirno", dteTarih.Value.ToSqlString(), ((DbDepo)cmbDepo.SelectedItem).recId, Cevir.Parse<int>(txtSayimNo.Text)));
            gridControl1.Columns[0].Width = 200;
            tabPage3.Enabled = true;
            Islem = Secim.SayilanListesi;
            gridControl1.ContextMenu = contextMenu1;
        }

        private void ClearValues()
        {
            SecilenBarkodId = -1;
            SecilenStokId = -1;
            txtFiltre.Text = string.Empty;
            txtEnvanter.Text = string.Empty;
            txtMiktar.Text = string.Empty;
            txtSayilan.Text = string.Empty;
            txtStokAdi.Text = string.Empty;
            txtStokKodu.Text = string.Empty;
            txtFiyat.Text = string.Empty;
            txtBirim.Text = string.Empty;
            txtFiltre.Focus();
        }

        private void SatirEkle()
        {
            if (txtMiktar.Text.ToCurrency() > 0)
            {
                if (!string.IsNullOrEmpty(txtSayilan.Text))
                {
                    if (txtSayilan.Text.ToCurrency() > 0)
                    {
                        DialogResult res = MessageBox.Show("Bu Ürün daha önce eklenmeiş ! yeni bir satır olarak eklemek için 'yes'i' önceki miktarı düzeltmek için 'no'yu seçin", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                        if (res == DialogResult.No)
                        {
                            if (SecilenBarkodId != -1)
                            {
                                using (Query q = new Query(ProgramTipleri.SqlCe))
                                {
                                    q.Add("delete from TBL_SAYIM where sym_tarih=@tarih and sym_depoid=@depo and sym_evrakno=@evrakno and sym_barkodid=@barkodid");
                                    q.Add("@tarih", SqlDbType.DateTime, new DateTime(dteTarih.Value.Year, dteTarih.Value.Month, dteTarih.Value.Day));
                                    q.Add("@depo", SqlDbType.Int, ((DbDepo)cmbDepo.SelectedItem).recId);
                                    q.Add("@evrakno", SqlDbType.Int, Cevir.Parse<int>(txtSayimNo.Text));
                                    q.Add("@barkodid", SqlDbType.Int, SecilenBarkodId);
                                    q.Exec();
                                }
                            }
                            else
                            {
                                SqlCeClient.Get.Exec(string.Format("DELETE FROM TBL_SAYIM WHERE (TBL_SAYIM.sym_tarih = '{0}') AND (TBL_SAYIM.sym_depoid = {1}) AND (TBL_SAYIM.sym_evrakno = {2}) AND (TBL_SAYIM.sym_stokid= {3})", dteTarih.Value.ToSqlString(), ((DbDepo)cmbDepo.SelectedItem).recId, txtSayimNo.Text, SecilenStokId));
                            }
                        }
                    }
                }


                int satir = (SqlCeClient.Get.ExecScalar<int>(string.Format("select max(sym_satirno) from TBL_SAYIM where sym_tarih='{0}' and sym_depoid={1} and sym_evrakno={2}", dteTarih.Value.ToSqlString(), ((DbDepo)cmbDepo.SelectedItem).recId, txtSayimNo.Text)) + 1);

                using (DbSayim sym = new DbSayim())
                {
                    sym.BarkodId = SecilenBarkodId;
                    sym.DepoNo = ((DbDepo)cmbDepo.SelectedItem).recId;
                    sym.EvrakNo = Cevir.Parse<int>(txtSayimNo.Text);
                    sym.Gonderildi = false;
                    sym.Miktar = txtMiktar.Text.ToCurrency();
                    sym.Satir = satir;
                    sym.StokId = SecilenStokId;
                    sym.Tarih = new DateTime(dteTarih.Value.Year, dteTarih.Value.Month, dteTarih.Value.Day);
                    try
                    {
                        sym.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    finally
                    {
                        ClearValues();
                    }
                }
            }
            else
            {
                MessageBox.Show("Miktarı Sıfır Giremezsiniz !");
            }
        }

        private void menuItem1_Click(object sender, EventArgs e)
        {
            if (Islem == Secim.SayilanListesi)
            {
                DialogResult res = MessageBox.Show("Silmek istediğinize eminmisiniz ?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                if (res == DialogResult.Yes)
                {
                    int row = gridControl1.CurrentRowIndex;
                    if (row > -1)
                    {
                        int satir = Cevir.Parse<int>(gridControl1[row, 3]);
                        using (Query q = new Query(ProgramTipleri.SqlCe))
                        {
                            q.Add("delete from TBL_SAYIM where sym_tarih=@tarih and sym_depoid=@depo,sym_evrakno=@evrakno,sym_satirno=@satir");
                            q.Add("@tarih", SqlDbType.DateTime, new DateTime(dteTarih.Value.Year, dteTarih.Value.Month, dteTarih.Value.Day));
                            q.Add("@depo", SqlDbType.Int, ((DbDepo)cmbDepo.SelectedItem).recId);
                            q.Add("@evrakno", SqlDbType.Int, Cevir.Parse<int>(txtSayimNo.Text));
                            q.Add("@satir", SqlDbType.Int, SecilenBarkodId);
                            q.Exec();
                            gridControl1.RemoveRow(row);
                        }
                    }
                }
            }
        }

        private void txtSayimNo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                SayimGiris();
            }
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            UrunBul();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SatirEkle();
        }

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.Islem == Secim.SayilanListesi && tabControl1.SelectedIndex == 2)
            {
                SayilanListesi();
            }
        }

        bool _keyboardShow = false;
        private void button2_Click(object sender, EventArgs e)
        {
            if (!_keyboardShow)
            {
                _keyboardShow = true;
                Sip.Show();
            }
            else
            {
                Sip.Hide();
                _keyboardShow = false;
            }
        }

        private void btnGeri_Click(object sender, EventArgs e)
        {
            switch (tabControl1.SelectedIndex)
            {
                case 0:
                    this.Close();
                    break;
                case 1:
                    tabControl1.SelectedIndex = 0;
                    break;
                case 2:
                    tabControl1.SelectedIndex = 1;
                    break;
            }
        }
    }
}